package test0316;

/**
 * @author 兴趣使然黄小黄
 * @version 1.0
 * @date 2023/3/19 8:43
 * 编写代码, 实现多线程数组求和.
 *     给定一个很长的数组 (长度 1000w), 通过随机数的方式生成 1-100 之间的整数.
 *     实现代码, 能够创建两个线程, 对这个数组的所有元素求和.
 *     其中线程1 计算偶数下标元素的和, 线程2 计算奇数下标元素的和.
 *     最终再汇总两个和, 进行相加
 *     记录程序的执行时间.
 */
@SuppressWarnings({"all"})
public class Main01 {

    public static void main(String[] args) {
        long startTime = System.currentTimeMillis(); // 记录开始时间
        // 给定一个很长的数组 (长度 1000w), 通过随机数的方式生成 1-100 之间的整数.
        final int total = 1000_0000;
        int[] array = new int[total];
        for (int i = 0; i < array.length; i++) {
            array[i] = (int) (Math.random() * 100) + 1;
        }
        // 将操作类实例化
        SumOperator sumOperator = new SumOperator();
        // 线程 1 计算偶数下标元素和
        Thread t1 = new Thread(() -> {
            for (int i = 0; i < total; i += 2) {
                sumOperator.addEvenSum(i);
            }
        });
        // 线程 2 计算奇数下标元素和
        Thread t2 = new Thread(() -> {
            for (int i = 1; i < total; i += 2) {
                sumOperator.addOddSum(i);
            }
        });
        // 启动两个线程
        t1.start();
        t2.start();
        // 等待两个线程结束
        try {
            t1.join();
            t2.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        long endTime = System.currentTimeMillis(); // 记录结束时间
        System.out.println("结果为: " + sumOperator.result());
        System.out.println("总耗时: " + (endTime - startTime) + "ms");
    }
}

// 累加操作用这个类来完成
@SuppressWarnings({"all"})
class SumOperator {
    private long evenSum; // 偶数和
    private long oddSum; // 奇数和

    public void addEvenSum (int num) {
        evenSum += num;
    }

    public void addOddSum (int num) {
        oddSum += num;
    }

    public long result() {
        System.out.println("偶数和：" + evenSum);
        System.out.println("奇数和：" + oddSum);
        return evenSum + oddSum;
    }
}
